# -*- coding: utf-8 -*-

'''
	 autor: João Rebocho Nº 6035
	 data: 23 de Outubro de 2013
	 obs: 1ª Parte do Trabalho de LP
'''
#imports da classe Ler_Dados_E_Escrever
import sqlite3
from xlrd import open_workbook
from Estatisticas import* 
from EstatisticasDistrito import* 

class Ler_Dados_E_Escrever:
    
    
    def ler_ficheiro_excel(self):
        '''
        Neste método leio os ficheiros exel cna131fresultados.xls e Distritos.xls
        e guardo os valores destes ficheiros na variáveis lerficheiro e ler ficheiro2
        '''
        try:
            #Lê o ficheiro e coloca os resultados na variável lerficheiro
            lerficheiro = open_workbook('cna131fresultados.xls', 'r')
            lerficheiro2 = open_workbook('Distritos.xls', 'r')
        except:
            print "não existe nenhum ficheiro"
        #Chamada do método onde crio a Base de dado
        self.criar_BD(lerficheiro, lerficheiro2)
        pass
    
    def criar_BD(self, lerficheiro, lerficheiro2):
        sheet = lerficheiro.sheet_by_index(0)
        #Faz a conexao à base de dados
        base = sqlite3.connect('cna131fresultados.db')
        cursor = base.cursor()
		
		#Verifica se a tabela ja existe
        cursor.execute('''DROP TABLE IF EXISTS cna131fresultados''')
        #Cria a tabela
        cursor.execute('''CREATE TABLE cna131fresultados(COD_INSTITUICAO number, COD_CURSO number, 
                                                    NOME_DA_INSTITUICAO text, NOME_DO_CURSO text, GRAU number,
                                                    VAGAS_INICIAIS number, COLOCADOS number, NOTA_CANDIDATURA number,
                                                    VAGAS_SOBRANTE )''')
                                                    
        #Percorre o ficheiro e coloca os valores que foram lidos as suas variaveis                         
        for row in range(3, sheet.nrows): 
            COD_INSTITUICAO = sheet.cell(row, 0).value
            COD_CURSO = sheet.cell(row, 1).value
            NOME_INSTITUICAO = sheet.cell(row, 2).value
            NOME_CURSO = sheet.cell(row, 3).value
            GRAU = sheet.cell(row, 4).value
            VAGAS_INICIAIS = str(sheet.cell(row, 5).value)
            COLOCADOS = str(sheet.cell(row, 6).value)   
            NOTA_ULTIMO = str(sheet.cell(row, 7).value)
            VAGAS_SOBRANTES = str(sheet.cell(row, 8).value)
            
            #Insercao dos valores na base de dados
            cursor.execute('INSERT INTO cna131fresultados VALUES(?,?,?,?,?,?,?,?,?)',
                        (COD_INSTITUICAO, COD_CURSO, NOME_INSTITUICAO, NOME_CURSO
                        , GRAU, VAGAS_INICIAIS, COLOCADOS, NOTA_ULTIMO, VAGAS_SOBRANTES))
        #Chamada do método criar_BD2
        self.criar_BD2(cursor, lerficheiro2)
        
              
        base.commit()
        base.close()
        pass
    
    def criar_BD2(self, cursor, lerficheiro2):
        sheet = lerficheiro2.sheet_by_index(0)
        #Faz a conexao à base de dados
        base2 = sqlite3.connect('distritos.db')
        cursor2 = base2.cursor()
        
        #Verifica se a tabela ja existe
        cursor2.execute('''DROP TABLE IF EXISTS distritos''')
        #Cria a tabela
        cursor2.execute('''CREATE TABLE distritos (Distrito text, COD_INSTITUICAO2 number )''')
        
        #Percorre o ficheiro e coloca os valores que foram lidos as suas variaveis                         
        for row in range(1, sheet.nrows):
            Distrito = sheet.cell(row, 0).value
            COD_INSTITUICAO2 = str(sheet.cell(row, 1).value)
            
            #Insercao dos valores na base de dados
            cursor2.execute('INSERT INTO distritos VALUES(?,?)',(Distrito, COD_INSTITUICAO2))
        #Chamada da função numero de colocados
        self.guardarValores(cursor, cursor2)
        base2.commit()
        base2.close()
        pass

        pass
   
    
    def guardarValores(self, cursor, cursor2):
        '''
        Neste método vou guardar os valores que li para as bases de dados e 
        vou guardar os valores nas seguintes variáveis:
        intituição - é um vector onde vou guardar os valores dos Códigos de Instituição
        nomeintituição - é um vector onde vou guardar os nomes de cada Instituição 
        colocados - é um vector onde vou guardar os valores de alunos colocados de cada Códigos de Instituição 
        vagasSobrantes - é um vector onde vou guardar os valores das vagas de alunos sobrantes de cada Instituição 
        distrito - é um vector onde vou guardar os Distritos 
        codInstituição - é um vector onde vou guardar os valores dos Códigos de Instituição de cada distrito
        numeroTotalDecolocados - nesta variavel vou guardar o numero de todos os alunos que foram colocados
        '''
        
        instituicao = []
        nomeinstituicao = []
        colocados = []
        vagasSobrantes = []        
        distrito = []
        codInstituicao = []
        numeroTotalDecolocados = 0
        
        #Vou percorrer os COD_INSTUTUICAO da base cna131fresultados, para guardar os valores nas variáveis acima referidas
        for row in cursor.execute('SELECT * FROM cna131fresultados WHERE COD_INSTITUICAO '):
            instituicao.append(row[0])
            nomeinstituicao.append(row[2])
            colocados.append(row[6])
            vagasSobrantes.append(row[8])
        #Vou percorrer os COD_INSTUTUICAO2 da base distritos, para guardar os valores nas variáveis acima referidas
        for row2 in cursor2.execute('SELECT * FROM distritos WHERE COD_INSTITUICAO2 '):
            distrito.append(row2[0])
            codInstituicao.append(row2[1])
        
        #Aqui faço várias chamadas à classe Estatisticas e às suas funções
        for x in range(0, len(instituicao)):
            numeroTotalDecolocados += colocados[x]
            #Chamada da classe Estatisticas
            estatisticas = Estatisticas(instituicao[x], nomeinstituicao[x], colocados[x], vagasSobrantes[x], numeroTotalDecolocados)
        #Chamada dos vários métodos da classes Estatisticas que realizam as estatisticas
        estatisticas.estatisticasInstituicao(instituicao, nomeinstituicao, colocados, vagasSobrantes, numeroTotalDecolocados)
        estatisticas.graficosNumeroColocados()
        estatisticas.graficosPercentagemColocados()
        estatisticas.graficosVagasColocados()
        
        #Chamada dos metodos estatisticasDistrito
        self.estatisticasDistrito(x, instituicao, nomeinstituicao, colocados, vagasSobrantes, distrito, codInstituicao, numeroTotalDecolocados)
        pass
        
    def estatisticasDistrito(self,x, instituicao, nomeinstituicao, colocados, vagasSobrantes, distrito, codInstituicao, numeroTotalDecolocados):
        '''
        Neste método vou guardar o valor do numero de colocados por distritos no ficheiro csv
        numeroDeColocadosDistrito, alem disso faço tambem chamadas aos metodos da classe que 
        calculam as várias estatisticas alem de fazer a chamada à classe estatistica
        numeroDeColocadosDistrito - abertura do ficheiro csv
        '''
        numeroDeColocadosDistrito = csv.writer(open("NumeroDeColocadosDistrito.csv", "wb"))
        for l in range(0, x):
            for k in range(0, len(distrito)):
                #Chamada da classe EstatisticasDistrito
                estatisticasDistrito = EstatisticasDistrito(instituicao[l], nomeinstituicao[l], colocados[l], vagasSobrantes[l], distrito[k], codInstituicao[k], numeroTotalDecolocados)
		
		#inicialização da variavel i que vai ser utilizada no metodo estatisticasDistrito1  
        i = 0
        #Chamada dos metodos estatisticasDistrito1, graficosVagasColocadosDistritos, graficosPermilagemColocadosDistritos, graficosVagasColocadosDistritos.
        estatisticasDistrito.estatisticasDistrito1(instituicao, colocados, vagasSobrantes, distrito, codInstituicao, i)
        estatisticasDistrito.graficosNumeroColocadosDistritos()
        estatisticasDistrito.graficosPermilagemColocadosDistritos()
        estatisticasDistrito.graficosVagasColocadosDistritos()
        
        pass
    
#Chamada da classe Ler_Dados_E_Escrever e do metodo da classe ler_ficheiro_excel
bd = Ler_Dados_E_Escrever()
bd.ler_ficheiro_excel()
